package com.ljk.util.file;

import com.ljk.util.string.StringUtil;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.io.IOUtils;

import java.io.*;
import java.util.StringJoiner;

/**
 * 文件处理工具类
 *
 * @author ruoyi
 */
public class FileUtil {
    /** 文件名称验证的正则表达式 */
    public static String FILENAME_PATTERN = "[a-zA-Z0-9_\\-|.\\u4e00-\\u9fa5]+";

    /**
     * 输出指定文件的byte数组
     *
     * @param filePath 文件路径
     * @param os       输出流
     */
    public static void writeBytes(String filePath, OutputStream os) throws IOException {
        FileInputStream fis = null;
        try {
            File file = new File(filePath);
            if (!file.exists()) {
                throw new FileNotFoundException(filePath);
            }
            fis = new FileInputStream(file);
            byte[] b = new byte[1024];
            int length;
            while ((length = fis.read(b)) > 0) {
                os.write(b, 0, length);
            }
            os.flush();
        } finally {
            IOUtils.close(fis);
        }
    }


    /**
     * 删除文件
     *
     * @param filePath 文件路径
     */
    public static void deleteFile(String filePath) {
        deleteFile(new File(filePath));
    }

    /**
     * 删除文件
     *
     * @param file 文件名
     * @author ljk
     * @since 2025/3/25 20:17
     */
    public static void deleteFile(File file) {
        // 路径为文件且不为空则进行删除
        if (file.isFile() && file.exists()) {
            if (!file.delete()) {
                file.deleteOnExit();
            }
        }
    }

    /**
     * 文件名称验证
     *
     * @param filename 文件名称
     * @return true 正常 false 非法
     */
    public static boolean isValidFilename(String filename) {
        return filename.matches(FILENAME_PATTERN);
    }


    /**
     * 获取文件名称 /profile/upload/2022/04/16/ruoyi.png -- ruoyi.png
     *
     * @param fileName 路径名称
     * @return 没有文件路径的名称
     */
    public static String getName(String fileName) {
        return FilenameUtils.getName(fileName);
    }

    /**
     * 获取不带后缀文件名称 /profile/upload/2022/04/16/abc.png -- abc
     *
     * @param fileName 路径名称
     * @return 没有文件路径和后缀的名称
     */
    public static String getNameNotSuffix(String fileName) {
        return FilenameUtils.getBaseName(fileName);
    }

    /**
     * 拼接文件路径和文件名
     *
     * @param fileName      文件名
     * @param filePathArray 文件路径
     * @return 全路径名
     * @author ljk
     * @since 2025/3/25 20:12
     */
    public static String concatBatchFilePathAndFileName(String fileName, String... filePathArray) {
        if (filePathArray == null || filePathArray.length == 0) {
            return fileName;
        }
        StringJoiner sj = new StringJoiner(File.separator);
        for (String path : filePathArray) {
            sj.add(path);
        }
        sj.add(fileName);
        return sj.toString();
    }

    /**
     * 拼接文件路径和文件名
     *
     * @param fileName 文件名
     * @param filePath 文件路径
     * @return 全路径名
     * @author ljk
     * @since 2025/3/25 20:12
     */
    public static String concatFilePathAndFileName(String filePath, String fileName) {
        return StringUtil.isEmpty(filePath) ? fileName : filePath + File.separator + fileName;
    }


}

